#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
预测任务执行调试脚本
检查任务是否正常执行并写入结果
"""

import sys
import os
import time
from datetime import datetime

# 添加项目根目录到Python路径
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

from flask import Flask
from config import get_config
from src.models.database import db, PredictionTask, PredictionResult, HistoricalData
from src.models.metaso_data import MetasoQueryData
from src.services.prediction_service import PredictionService

def create_app():
    """创建Flask应用实例"""
    config = get_config()
    app = Flask(__name__)
    app.config.from_object(config)
    db.init_app(app)
    return app

def debug_task_execution(task_id):
    """调试任务执行情况"""
    print(f"🔍 调试任务执行情况: {task_id}")
    print("=" * 60)
    
    app = create_app()
    with app.app_context():
        # 1. 检查任务是否存在
        task = PredictionTask.query.filter_by(task_id=task_id).first()
        if not task:
            print(f"❌ 任务不存在: {task_id}")
            return
        
        print(f"✅ 任务存在")
        print(f"📋 任务信息:")
        print(f"   ID: {task.task_id}")
        print(f"   名称: {task.task_name}")
        print(f"   类型: {task.task_type}")
        print(f"   状态: {task.status}")
        print(f"   进度: {task.progress}%")
        print(f"   当前步骤: {task.current_step}")
        print(f"   创建时间: {task.created_at}")
        print(f"   开始时间: {task.started_at}")
        print(f"   完成时间: {task.completed_at}")
        if task.error_message:
            print(f"   错误信息: {task.error_message}")
        
        # 2. 检查任务参数
        print(f"\n📊 任务参数:")
        print(f"   公司IDs: {task.company_ids}")
        print(f"   产品IDs: {task.product_ids}")
        print(f"   预测年份: {task.prediction_years}")
        print(f"   描述: {task.description}")
        
        # 3. 检查预测结果
        results = PredictionResult.query.filter_by(task_id=task_id).all()
        print(f"\n📈 预测结果:")
        print(f"   结果数量: {len(results)}")
        
        if results:
            for i, result in enumerate(results[:5]):  # 显示前5个结果
                print(f"   结果 {i+1}:")
                print(f"     公司: {result.company_name}")
                print(f"     产品: {result.product_name}")
                print(f"     年份: {result.prediction_year}")
                print(f"     销售额: {result.predicted_sales_amount}")
                print(f"     置信度: {result.confidence_score}")
        else:
            print("   ❌ 无预测结果")
        
        # 4. 检查数据源
        print(f"\n📚 数据源检查:")
        
        # 检查历史数据
        historical_count = HistoricalData.query.count()
        print(f"   历史数据记录数: {historical_count}")
        
        if historical_count > 0:
            sample_historical = HistoricalData.query.first()
            print(f"   历史数据示例: {sample_historical.business_unit} - {sample_historical.metric_name}")
        
        # 检查行业数据
        metaso_count = MetasoQueryData.query.count()
        print(f"   行业数据记录数: {metaso_count}")
        
        if metaso_count > 0:
            sample_metaso = MetasoQueryData.query.first()
            print(f"   行业数据示例: {sample_metaso.sector_name} - {sample_metaso.status}")
        
        # 5. 如果任务失败或未完成，尝试手动执行
        if task.status in ['pending', 'failed']:
            print(f"\n🔧 尝试手动执行任务...")
            try:
                prediction_service = PredictionService()
                prediction_service._execute_prediction_task(task_id)
                print("✅ 手动执行成功")
            except Exception as e:
                print(f"❌ 手动执行失败: {str(e)}")
                import traceback
                print(f"详细错误信息:")
                print(traceback.format_exc())

def check_database_connection():
    """检查数据库连接"""
    print("🔗 检查数据库连接...")
    
    app = create_app()
    with app.app_context():
        try:
            # 测试数据库查询
            task_count = PredictionTask.query.count()
            result_count = PredictionResult.query.count()
            historical_count = HistoricalData.query.count()
            metaso_count = MetasoQueryData.query.count()
            
            print(f"✅ 数据库连接正常")
            print(f"📊 数据表统计:")
            print(f"   预测任务: {task_count} 条")
            print(f"   预测结果: {result_count} 条")
            print(f"   历史数据: {historical_count} 条")
            print(f"   行业数据: {metaso_count} 条")
            
        except Exception as e:
            print(f"❌ 数据库连接失败: {str(e)}")

def list_recent_tasks():
    """列出最近的任务"""
    print("📋 最近的预测任务:")
    print("-" * 40)
    
    app = create_app()
    with app.app_context():
        tasks = PredictionTask.query.order_by(PredictionTask.created_at.desc()).limit(10).all()
        
        for i, task in enumerate(tasks, 1):
            print(f"{i}. {task.task_id[:8]}... - {task.task_name}")
            print(f"   状态: {task.status} | 类型: {task.task_type}")
            print(f"   创建: {task.created_at}")
            print()

def main():
    """主函数"""
    print("🚀 预测任务执行调试工具")
    print("=" * 60)
    
    # 1. 检查数据库连接
    check_database_connection()
    print()
    
    # 2. 列出最近的任务
    list_recent_tasks()
    
    # 3. 调试指定任务
    if len(sys.argv) > 1:
        task_id = sys.argv[1]
        debug_task_execution(task_id)
    else:
        print("💡 使用方法:")
        print("   python debug_task_execution.py <task_id>")
        print("   例如: python debug_task_execution.py bba1d445-cf12-44b9-9613-f15c18bb5e2e")

if __name__ == "__main__":
    main()
